package com.tdy.cdc.util;

import com.alibaba.druid.pool.DruidDataSource;

import java.sql.Connection;
import java.sql.SQLException;

/**
 * @author NanHuang
 * @Date 2023/2/28
 */
public class JDBCUtil {
    private static DruidDataSource configSource;
    private static DruidDataSource mysqlDataSource;
    private static DruidDataSource cdrDataSource;

    static {
        // MySQL-配置表
        // 创建连接池
        configSource = new DruidDataSource();
        // 设置驱动全类名
        configSource.setDriverClassName(ConfigUtil.getProperty("mysql.config.driver"));
        // 设置连接 url
        configSource.setUrl(ConfigUtil.getProperty("mysql.config.url"));
        // 设置用户名
        configSource.setUsername(ConfigUtil.getProperty("mysql.config.username"));
        // 设置密码
        configSource.setPassword(ConfigUtil.getProperty("mysql.config.password"));
        // 设置初始化连接池时池中连接的数量
        configSource.setInitialSize(5);
        // 设置同时活跃的最大连接数
        configSource.setMaxActive(100);
        // 设置空闲时的最小连接数，必须介于 0 和最大连接数之间，默认为 0
        configSource.setMinIdle(10);
        // 设置没有空余连接时的等待时间，超时抛出异常，-1 表示一直等待
        configSource.setMaxWait(-1);
        // 验证连接是否可用使用的 SQL 语句
        configSource.setValidationQuery("select 1");
        // 指明连接是否被空闲连接回收器（如果有）进行检验，如果检测失败，则连接将被从池中去除
        // 注意，默认值为 true，如果没有设置 validationQuery，则报错
        // testWhileIdle is true, validationQuery not set
        configSource.setTestWhileIdle(true);
        // 借出连接时，是否测试，设置为 true，不测试可能连接无法使用
        configSource.setTestOnBorrow(true);
        // 归还连接时，是否测试
        configSource.setTestOnReturn(false);
        // 设置空闲连接回收器每隔 30s 运行一次
        configSource.setTimeBetweenEvictionRunsMillis(30 * 1000L);
        // 设置池中连接空闲 30min 被回收，默认值即为 30 min
        configSource.setMaxEvictableIdleTimeMillis(30 * 60 * 1000L);

        // MySQL-hip-master表
        // 创建连接池
        mysqlDataSource = new DruidDataSource();
        // 设置驱动全类名
        mysqlDataSource.setDriverClassName(ConfigUtil.getProperty("mysql.driver"));
        // 设置连接 url
        mysqlDataSource.setUrl(ConfigUtil.getProperty("mysql.url"));
        // 设置用户名
        mysqlDataSource.setUsername(ConfigUtil.getProperty("mysql.username"));
        // 设置密码
        mysqlDataSource.setPassword(ConfigUtil.getProperty("mysql.password"));
        // 设置初始化连接池时池中连接的数量
        mysqlDataSource.setInitialSize(5);
        // 设置同时活跃的最大连接数
        mysqlDataSource.setMaxActive(100);
        // 设置空闲时的最小连接数，必须介于 0 和最大连接数之间，默认为 0
        mysqlDataSource.setMinIdle(10);
        // 设置没有空余连接时的等待时间，超时抛出异常，-1 表示一直等待
        mysqlDataSource.setMaxWait(-1);
        // 验证连接是否可用使用的 SQL 语句
        mysqlDataSource.setValidationQuery("select 1");
        // 指明连接是否被空闲连接回收器（如果有）进行检验，如果检测失败，则连接将被从池中去除
        // 注意，默认值为 true，如果没有设置 validationQuery，则报错
        // testWhileIdle is true, validationQuery not set
        mysqlDataSource.setTestWhileIdle(true);
        // 借出连接时，是否测试，设置为 true，不测试可能连接无法使用
        mysqlDataSource.setTestOnBorrow(true);
        // 归还连接时，是否测试
        mysqlDataSource.setTestOnReturn(false);
        // 设置空闲连接回收器每隔 30s 运行一次
        mysqlDataSource.setTimeBetweenEvictionRunsMillis(30 * 1000L);
        // 设置池中连接空闲 30min 被回收，默认值即为 30 min
        mysqlDataSource.setMaxEvictableIdleTimeMillis(30 * 60 * 1000L);

        // MySQL-CDR表
        // 创建连接池
        cdrDataSource = new DruidDataSource();
        // 设置驱动全类名
        cdrDataSource.setDriverClassName(ConfigUtil.getProperty("mysql.cdr.driver"));
        // 设置连接 url
        cdrDataSource.setUrl(ConfigUtil.getProperty("mysql.cdr.url"));
        // 设置用户名
        cdrDataSource.setUsername(ConfigUtil.getProperty("mysql.cdr.username"));
        // 设置密码
        cdrDataSource.setPassword(ConfigUtil.getProperty("mysql.cdr.password"));
        // 设置初始化连接池时池中连接的数量
        cdrDataSource.setInitialSize(5);
        // 设置同时活跃的最大连接数
        cdrDataSource.setMaxActive(100);
        // 设置空闲时的最小连接数，必须介于 0 和最大连接数之间，默认为 0
        cdrDataSource.setMinIdle(10);
        // 设置没有空余连接时的等待时间，超时抛出异常，-1 表示一直等待
        cdrDataSource.setMaxWait(-1);
        // 验证连接是否可用使用的 SQL 语句
        cdrDataSource.setValidationQuery("select 1");
        // 指明连接是否被空闲连接回收器（如果有）进行检验，如果检测失败，则连接将被从池中去除
        // 注意，默认值为 true，如果没有设置 validationQuery，则报错
        // testWhileIdle is true, validationQuery not set
        cdrDataSource.setTestWhileIdle(true);
        // 借出连接时，是否测试，设置为 true，不测试可能连接无法使用
        cdrDataSource.setTestOnBorrow(true);
        // 归还连接时，是否测试
        cdrDataSource.setTestOnReturn(false);
        // 设置空闲连接回收器每隔 30s 运行一次
        cdrDataSource.setTimeBetweenEvictionRunsMillis(30 * 1000L);
        // 设置池中连接空闲 30min 被回收，默认值即为 30 min
        cdrDataSource.setMaxEvictableIdleTimeMillis(30 * 60 * 1000L);
    }

    public static Connection getConfigConnection() throws SQLException {
        return configSource.getConnection();
    }

    public static Connection getMySQLConnection() throws SQLException {
        return mysqlDataSource.getConnection();
    }

    public static Connection getCdrConnection() throws SQLException {
        return cdrDataSource.getConnection();
    }
}
